<?php

class McCube_String_Filters{

    /**
     * Filtre pour executer des preg_match
     * @param  string $value
     * @param  string $filterOption
     * @return boolean
     */
    public static  function preg($value,$filterOption/* motif */){
        return preg_match('`'.$filterOption.'`',$value);
    }

    /**
     * Filtre pour valider le fait qu'une chaine ne peut pas etre vide
     * @param  string $value
     * @return boolean
     */
    public static  function required($value){
        return !(empty($value));
    }

    /**
     * Filtre pour valider la longueur min d'une chaine (en caractere)
     * @param  string $value
     * @param  int      $filterOption
     * @return boolean
     */
    public static  function sizeMin($value,$filterOption){
        return (strlen($value) >= $filterOption);
    }

    /**
     * Filtre pour valider la longueur max d'une chaine (en caractere)
     * @param  string $value
     * @param  int      $filterOption
     * @return boolean
     */
    public static  function sizeMax($value,$filterOption){
        return (strlen($value) <= $filterOption);
    }

    /**
     * Filtre pour valider qu'un nombre n'est pas trop petit
     * @param  string   $value
     * @param  numeric  $filterOption
     * @return boolean
     */
    public static  function superior($value,$filterOption){
        return ($value >= $filterOption);
    }

    /**
     * Filtre pour valider qu'un nombre n'est pas trop grand
     * @param  string   $value
     * @param  numeric  $filterOption
     * @return boolean
     */
    public static  function inferior($value,$filterOption){
        return ($value <= $filterOption);
    }

    /**
     * Filtre pour valider une chaine de caractere avec obligatoirement :
     * - Pas d'espace
     * @param  string $value
     * @param  mixed $filterOption
     * @return boolean
     */
    public static  function noSpace($value,$filterOption=''){
        if($filterOption === true){$filterOption = ' ';}
        return (strpos($value,$filterOption) === false);
    }

    /**
     * Filtre pour valider une chaine de caractere avec obligatoirement :
     * - Pas d'espace
     * - Minimum 1 chiffre
     * - Minimum 1 lettre
     * @param  string $value
     * @return boolean
     */
    public static  function pwSecureLow($value){
        return self::applyFilterPreg($value,'(?!.+[[:space:]]{1,})(?=.*[[:digit:]]{1,})(?=.*[[:alpha:]]{1,})');
    }

    /**
     * Filtre pour valider une chaine de caractere avec obligatoirement :
     * - Pas d'espace
     * - Minimum 1 chiffre
     * - Minimum 1 lettre
     * - Minimum 1 ponctuation | Minimum 1 lettre majuscule
     * @param  string $value
     * @param  string   $filterOption
     * @return boolean
     */
    public static  function pwSecureMedium($value,$filterOption){
        if($filterOption === true){$filterOption = 'punc';}
        switch($filterOption){
            case    'upper' :$pattern = '(?=.*[a-z]{1,})(?=.*[A-Z]{1,})';                   break;
            default             :$pattern = '(?=.*[[:alpha:]]{1,})(?=.*[[:punct:]]{1,})';   break;
        }
        return self::applyFilterPreg('(?!.+[[:space:]]{1,})(?=.*[[:digit:]]{1,})'.$pattern);
    }

    /**
     * Filtre pour valider une chaine de caractere avec obligatoirement :
     * - Pas d'espace
     * - Minimum 1 chiffre
     * - Minimum 1 lettre minuscule
     * - Minimum 1 lettre majuscule
     * - Minimum 1 ponctuation
     * @param  string $value
     * @return boolean
     */
    public static  function pwSecureHigh($value){
        return self::applyFilterPreg($value,'(?!.+[[:space:]]{1,})(?=.*[[:digit:]]{1,})(?=.*[a-z]{1,})(?=.*[A-Z]{1,})(?=.*[[:punct:]]{1,})');
    }

    /**
     * Filtre pour valider une chaine de caractere strictement alphanumerique
     * @param  string $value
     * @return boolean
     */
    public static  function alphanum($value){
        return ctype_alnum($value);
    }

    /**
     * Filtre pour valider une chaine de caractere strictement alphabetique
     * @param  string $value
     * @return boolean
     */
    public static  function alpha($value){
        return ctype_alpha($value);
    }

    /**
     * Filtre pour valider un nombre/chiffre
     * @param  string $value
     * @return boolean
     */
    public static  function numeric($value){
        return is_numeric($value);
    }

    /**
     * Filtre pour valider un nombre flottant
     * @param  string $value
     * @return boolean
     */
    public static  function float($value){
        return is_float($value);
    }

    /**
     * Filtre pour valider un entier
     * @param  string $value
     * @return boolean
     */
    public static  function int($value){
        return is_int($value);
    }

    /**
     * Filtre pour valider un email
     * @param  string $value
     * @return boolean
     */
    public static  function email($value){
        return filter_var($value, FILTER_VALIDATE_EMAIL);
    }

    /**
     * Filtre pour valider une url
     * @param  string $value
     * @return boolean
     */
    public static  function url($value){
        return filter_var($value, FILTER_VALIDATE_URL,FILTER_FLAG_SCHEME_REQUIRED);
    }

    /**
     * Filtre pour valider un numero de telephone
     * @param  string $value
     * @param  string $filterOption
     * @return boolean
     */
    public static  function phone($value,$filterOption){
        if($filterOption === true){$filterOption = 'fr';}
        switch($filterOption){
            case    'fr'    :$pattern = '^0[0-689]([-.\s]?\d{2}){4}$';  break;
        }
        return self::applyFilterPreg($pattern);
    }

}